package com.demo.deal_queue;

import com.demo.commons.MqCons;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author shenguangyang
 */
@Configuration
public class DealConfig {

    @Bean
    public DirectExchange dealBizDirectExchange() {
        return ExchangeBuilder.directExchange(MqCons.DEAL_BIZ_EXCHANGE).durable(true).build();
    }

    @Bean
    public Queue dealBizQueue() {
        Map<String, Object> arguments = new HashMap<>();
        // 设置队列中消息的过期时间, 10s之后会被转移到死信队列中
        arguments.put("x-message-ttl", 10000);
        // 当消息过期时候, 需要通过指定的交换机打入到死信队列中
        arguments.put("x-dead-letter-exchange", MqCons.DEAL_EXCHANGE);
        // 设置正常队列长度的限制
        // arguments.put("x-max-length", 6);
        /*
         * durable: 是否为持久队列（该队列将在服务器重启后保留下来）
         * exclusive: 是否为排它队列
         * autoDelete: 如果队列为空是否删除（如果服务器在不使用队列时是否删除队列）
         * routingKey: 队列路由键（队列绑定交换机的匹配键，例如：“user” 将会匹配到指定路由器下路由键为：
         *              【*.user、#.user】的队列）不能为null, 否则队列和交换机绑定失败
         */
        return new Queue(MqCons.DEAL_BIZ_QUEUE, true, false, false, arguments);
    }

    @Bean
    public Binding normalBinding(@Qualifier("dealBizQueue") Queue queue, @Qualifier("dealBizDirectExchange") DirectExchange exchange) {
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with("");
    }
}
